iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
自我挑戰組

多人連線遊戲背後的原理與實作系列 第 18

Day18 - 程式實作(TCP非同步處理篇)

  • 分享至 

  • xImage
  •  

非同步通訊端適用於大量使用網路的系統,或是無法等候網路作業完成再繼續進行的系統,讓多個連線執行緒同時作業不必等待,可避免玩家畫面像是卡住的現象,以及避免資料同時做運算處理,因而造成資料的運算結果有誤。在伺服器中 TCP Listener 的非同步方法需要用到BeginAcceptTcpClient & EndAcceptTcpClient 的方法來進行通訊,而客戶端則是使用 BeginConnect 及 EndConnect。伺服器端每次與客戶取得連線要重新打開監聽,客戶端則不用,並使用IAsyncResult 來儲存及呼叫資料參數AsyncCallBack。

在Server端處理新的客戶端TCP連線

/// <summary>Handles new TCP connections.</summary>
private static void TCPConnectCallback(IAsyncResult _result)
{
    TcpClient _client = tcpListener.EndAcceptTcpClient(_result);
    tcpListener.BeginAcceptTcpClient(TCPConnectCallback, null);
    for (int i = 1; i <= MaxPlayers; i++)
    {
        if (clients[i].tcp.socket == null)
        {
            clients[i].tcp.Connect(_client);
            return;
        }
    }
    Debug.Log($"{_client.Client.RemoteEndPoint} failed to connect: Server full!");
}

在Client端處理TCP的相關資料

/// <summary>Initializes the newly connected client's TCP-related info.</summary>
private void ConnectCallback(IAsyncResult _result)
{
    socket.EndConnect(_result);
    if (!socket.Connected)
    {
        return;
    }
    stream = socket.GetStream();
    receivedData = new Packet();
    stream.BeginRead(receiveBuffer, 0, dataBufferSize, ReceiveCallback, null);
}

上一篇
Day17 - 程式實作(TCP監聽篇)
下一篇
Day19 - 程式實作(UDP篇)
系列文
多人連線遊戲背後的原理與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言